package com.miniapp.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.miniapp.entity.R;
import com.miniapp.entity.Role;
import com.miniapp.service.RoleService;
import com.miniapp.domain.vo.RoleQueryVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 角色管理控制器
 *
 * @author yourname
 * @date 2025-09-08
 */
@RestController
@RequestMapping("/api/roles")
@Api(tags = "角色管理")
public class RoleController {

    @Resource
    private RoleService roleService;

    /**
     * 分页查询角色列表
     */
    @GetMapping("/page")
    @ApiOperation("分页查询角色列表")
    public R page(RoleQueryVO queryVO) {
        try {
            IPage<Role> rolePage = roleService.queryRolePage(queryVO);
            return R.success(rolePage.getRecords(), rolePage.getTotal(), rolePage.getCurrent(), rolePage.getSize());
        } catch (Exception e) {
            return R.error("查询角色列表失败: " + e.getMessage());
        }
    }

    /**
     * 查询所有角色
     */
    @GetMapping("/list")
    @ApiOperation("查询所有角色")
    public R list() {
        try {
            List<Role> roleList = roleService.list();
            return R.success(roleList);
        } catch (Exception e) {
            return R.error("查询角色失败: " + e.getMessage());
        }
    }

    /**
     * 根据ID查询角色
     */
    @GetMapping("/{id}")
    @ApiOperation("根据ID查询角色")
    public R getById(@PathVariable Long id) {
        try {
            Role role = roleService.getById(id);
            return R.success(role);
        } catch (Exception e) {
            return R.error("查询角色失败: " + e.getMessage());
        }
    }

    /**
     * 新增角色
     */
    @PostMapping
    @ApiOperation("新增角色")
    public R save(@RequestBody Role role) {
        try {
            boolean success = roleService.saveRole(role);
            return success ? R.success("新增角色成功") : R.error("新增角色失败");
        } catch (Exception e) {
            return R.error("新增角色失败: " + e.getMessage());
        }
    }

    /**
     * 修改角色
     */
    @PutMapping
    @ApiOperation("修改角色")
    public R update(@RequestBody Role role) {
        try {
            boolean success = roleService.updateRole(role);
            return success ? R.success("修改角色成功") : R.error("修改角色失败");
        } catch (Exception e) {
            return R.error("修改角色失败: " + e.getMessage());
        }
    }

    /**
     * 删除角色
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除角色")
    public R removeById(@PathVariable Long id) {
        try {
            boolean success = roleService.removeById(id);
            return success ? R.success("删除角色成功") : R.error("删除角色失败");
        } catch (Exception e) {
            return R.error("删除角色失败: " + e.getMessage());
        }
    }

    /**
     * 分配用户角色
     */
    @PostMapping("/assign")
    @ApiOperation("分配用户角色")
    public R assignUserRoles(@RequestParam Long userId, @RequestBody List<Long> roleIds) {
        try {
            boolean success = roleService.assignUserRoles(userId, roleIds);
            return success ? R.success("分配角色成功") : R.error("分配角色失败");
        } catch (Exception e) {
            return R.error("分配角色失败: " + e.getMessage());
        }
    }

    /**
     * 根据用户ID查询角色列表
     */
    @GetMapping("/user/{userId}")
    @ApiOperation("根据用户ID查询角色列表")
    public R getUserRoles(@PathVariable Long userId) {
        try {
            List<String> roleCodes = roleService.getUserRoleCodes(userId);
            return R.success(roleCodes);
        } catch (Exception e) {
            return R.error("查询用户角色失败: " + e.getMessage());
        }
    }
}
